<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        //========================================= let
        // var a = 1;
        // var a = 2; //多次声明，后者覆盖前者
        // let b = 3;
        // let b = 4; //重复声明异常
        // console.log(a);
        // console.log(b);

        // for (var i = 0; i < 10; i++) {
        //     setTimeout(function(){
        //         console.log(i); //i是全局i，循环之后执行，打印10个10
        //     })
        // }

        // for (let j = 0; j < 10; j++) { //每次循环j都是全新的，循环内部会将实际值返回给新定义的j
        //     setTimeout(function(){
        //         console.log(j); //正常打印
        //     })
        // }

        // console.log(a); //不存在变量提升，异常
        // let a = 1;
        // console.log(b); //存在变量提升，只是未赋值
        // var b = 2;

        //========================================= const
        // var PI = "a";
        // if(true){ //
        //     console.log(PI);  // 代码块内形成封闭作用域，代码块内定义（用let const定义）与外部同名变量如果放在调用之后，也不会先调用外部，而是会报异常
        //     const PI = "3.1415926";
        // }

        //========================================= 解构
        // let [a, b, c, d, e] = 'hello';
        // console.log(a,b,c,d,e);

        // let [a = 2] = [undefined]; //undefined或空，则触发返回默认值
        // let [b,c,...d] = [1,2,3,4,5,6,7];
        // console.log(a);
        // console.log(b,c,d);//d为数组

        // let {b:x,a:y,...rest} = {a:10,b:20,c:30,d:40}; //a标识接收的目标,x为自定义接收名
        // console.log(x,y,rest); //rest接收为对象

        //========================================= Symbol
        // let red = Symbol("red");
        // let green = Symbol("green");
        // console.log(red);
        // let obj = {[red] : "red"};//定义对象和属性 这种赋值定义需要用[]
        // Object.defineProperty(obj,green,{value:"green"});//定义属性
        // console.log(obj);

        //========================================= Map
        //Map pk Object 有序，size属性返回个数，没有原型链属性和自定义属性冲突，键名可以是任意类型
        // let map = new Map();
        // map.set(NaN, "not a number");
        // console.log(map.get(NaN));
        // console.log(map.get(Number("a")));

        // let map = new Map();
        // map.set(3,"zero");
        // map.set(1,"one");
        // map.set(2,"two");
        // for(let [k,v] of map.entries()){ //返回一个新的按插入顺序排序的iterator对象，好像和不加没什么区别
        //     console.log(k,":", v);
        // }
        // for(let k of map.keys()){
        //     console.log(k,":", "v");
        // }
        // for(let v of map.values()){
        //     console.log("k",":", v);
        // }
        // map.forEach(function(v, k, mp) {
        //     console.log(k + " = " + v);
        //     console.log(this);
        //     console.log(mp);
        // }, map)

        // var kvArray = [["key1", "value1"], ["key2", "value2"]];
        // var map = new Map(kvArray); //二维数组转map
        // console.log(map);
        // var kvMap = new Map();
        // kvMap.set("key1","value1");
        // kvMap.set("key2","value2");
        // var arr = Array.from(kvMap); //map转二维数组
        // console.log(arr);

        // var myMap1 = new Map([["key1", "value1"], ["key2", "value2"]]); 
        // var myMap2 = new Map(myMap1); //克隆一份
        // console.log(myMap1 === myMap2);

        // var first = new Map([[1, 'one'], [2, 'two'], [3, 'three'],]);
        // var second = new Map([[1, 'one -'], [2, 'two -']]);
        // var merged = new Map([...first,...second]); //合并
        // console.log(merged);

        //========================================= Set
        // //唯一性
        // let set = new Set();
        // let a;
        // let obj = {b:"bb"};
        // set.add(NaN);
        // set.add(Number("nan"));
        // set.add(a);
        // set.add(undefined);
        // set.add(obj); //引用不同即可
        // set.add({b:"bb"});
        // console.log(set);

        // //转换
        // let arr = ["a","b","c"];
        // let aset = new Set(arr);
        // let sarr = [...aset];
        // console.log(aset);
        // console.log(sarr);
        // let str = "hello";
        // console.log(new Set(str));

        // // 数组去重
        // var mySet = new Set([1, 2, 3, 4, 4]);
        // console.log([...mySet]);
        
        // let set1 = new Set(["a","b","c",1,2,3]);
        // let set2 = new Set(["c","d","e",2]);
        // //并集
        // let union = new Set([...set1,...set2]);
        // console.log(union);
        // //交集
        // let instersect = new Set([...set1].filter(item => {return set2.has(item)}));
        // console.log(instersect);
        // //差集
        // let different = new Set([...[...set1].filter(item => !set2.has(item)),...[...set2].filter(item => !set1.has(item))]);
        // console.log(different);

    </script>
</body>
</html>